package com.yuyu.demo.spring4.annotation.aop;

import java.awt.Point;
import java.lang.reflect.Method;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * AOP
 * Aspect Oriented Programming 面向切面编程
 * 1. 概念
 * 	切面(Aspect): 所有通知功能的集合对象
 * 	通知(Advice): AOP要完成的工作，叫通知
 *  对象(Target): 被应用通知的对象
 *  代理(Proxy): 添加了通知之后的对象
 *  连接点(JoinPoint): 应用程序执行的一个点，是客观存在的，包含执行时刻和方向
 *  切点(PointCut): 执行通知的点，是连接点的一个子集，一个切点可以有多个连接点
 * 
 * 2. Spring中的AOP是由动态代理实现的，尝试写一个动态代理
 * 3. 如何实现？
 * 	spring中可以通过aspectj来实现AOP功能
 * 	xml中开启aop注解通知<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
 * 	使用@Aspect注解表示这是一个切面，@Component表示切面也是一个普通的Spring组件
 * 4. 通知
 * 	Before：前置通知
 * 	After： 后置通知，类似于写在finally中，一定会执行，但最好不要在这个通知中对返回值处理
 * 	Arround: 环绕通知，在程序执行过程中，有特定入参，ProcessJoinPoint
 * 	AfterThrowing: 异常通知，在抛出异常的时候执行，默认只有runtimeException和Error会执行
 * 	AfterReturnning： 返回通知，在程序正常返回的时候执行	
 * 
 * 5. 其它
 * 	PointCut 切点可以提取出来
 * 	excution(public int com.xx.A.add(int,int))表达式，* 可以替代其中的某些
 * 	Order 如果有多个切面,可以使用该注解指定顺序
 * 
 * 6. 引入aop的依赖
 * <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>4.3.11.RELEASE</version>
		</dependency>
		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.11.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.10</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.10</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.5</version>
        </dependency>
 */


@Component
@Aspect
public class MyAOP {
	
	@Pointcut("execution(public void com.yuyu.demo.spring4.annotation.controller.AnController.hello())")
	private void point() {}
	
	@Before(value="point()")
	public void before() {
		System.out.println("before.......");
	}
	
	@After(value="point()")
	public void after() {
		System.out.println("after.......");
	}
	
	@AfterReturning(value="point()")
	public void afterReturning() {
		System.out.println("afterReturning.......");
	}
	
}
